package com.ruoyi.newsInfo.controller;

import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;

import com.ruoyi.bannerInfo.domain.BannerInfo;
import com.ruoyi.merchant.domain.Merchant;
import com.ruoyi.merchant.service.IMerchantService;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.newsInfo.domain.NewsInfo;
import com.ruoyi.newsInfo.service.INewsInfoService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.utils.SecurityUtils;

/**
 * 动态资讯Controller
 *
 * @author ruoyi
 * @date 2025-09-15
 */
@RestController
@RequestMapping("/ruoyi/newsInfo")
public class NewsInfoController extends BaseController
{
    @Autowired
    private INewsInfoService newsInfoService;

    @Autowired
    private IMerchantService merchantService;

    @Value("${miniapp.merchant-id:8}")
    private Long miniAppMerchantId;

    /**
     * 根据活动类型和启用状态查询资讯列表
     * @param newsType 资讯类型：1=活动 2=节日 3=公告）
     * @param status 启用状态（0=启用 1=禁用）
     * @return 分页数据
     */
    @GetMapping("/listByTypeAndStatus")
    public TableDataInfo listByTypeAndStatus(String newsType, String status) {

        // 获取当前用户所属商家ID
        Long userId = getUserId();
        Merchant merchantInfo = merchantService.selectMerchantByUserId(userId);
        Long merchantId = merchantInfo != null ? merchantInfo.getMerchantId() : null;

        // 非商家用户返回空数据
        if (merchantId == null) {
            return getDataTable(new ArrayList<>());
        }

        // 构造查询条件
        NewsInfo newsInfo = new NewsInfo();
        newsInfo.setMerchantId(merchantId);
        newsInfo.setNewsType(newsType);
        newsInfo.setStatus(status);

        // 执行查询
        startPage();
        List<NewsInfo> list = newsInfoService.selectNewsInfoListByTypeAndStatus(newsInfo);
        return getDataTable(list);
    }

    /**
     * 查询动态资讯列表
     */
//    @PreAuthorize("@ss.hasPermi('ruoyi:newsInfo:list')")
    @GetMapping("/list")
    public TableDataInfo list(NewsInfo newsInfo)
    {
        // 判断是否为管理员
        Long userId = getUserId();
        if (!getLoginUser().getUser().isAdmin()) {
            // 非管理员用户需要设置商家ID
            Long merchantId = getMerchantIdForCurrentUser();

            // 非商家用户返回空数据
            if (merchantId == null) {
                return getDataTable(new ArrayList<>());
            }

            // 添加商家ID查询条件
            newsInfo.setMerchantId(merchantId);
        }

        startPage();
        List<NewsInfo> list = newsInfoService.selectNewsInfoList(newsInfo);
        return getDataTable(list);
    }

    /**
     * 导出动态资讯列表
     */
//    @PreAuthorize("@ss.hasPermi('ruoyi:newsInfo:export')")
    @Log(title = "动态资讯", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public void export(HttpServletResponse response, NewsInfo newsInfo)
    {
        // 判断是否为管理员
        Long userId = getUserId();
        if (!getLoginUser().getUser().isAdmin()) {
            // 非管理员用户需要设置商家ID
            Long merchantId = getMerchantIdForCurrentUser();

            // 非商家用户返回空数据
            if (merchantId == null) {
                // 导出空数据
                ExcelUtil<NewsInfo> util = new ExcelUtil<NewsInfo>(NewsInfo.class);
                util.exportExcel(response, new ArrayList<>(), "动态资讯数据");
                return;
            }

            // 添加商家ID查询条件
            newsInfo.setMerchantId(merchantId);
        }

        List<NewsInfo> list = newsInfoService.selectNewsInfoList(newsInfo);
        ExcelUtil<NewsInfo> util = new ExcelUtil<NewsInfo>(NewsInfo.class);
        util.exportExcel(response, list, "动态资讯数据");
    }

    /**
     * 获取动态资讯详细信息
     */
//    @PreAuthorize("@ss.hasPermi('ruoyi:newsInfo:query')")
    @GetMapping(value = "/{newsId}")
    public AjaxResult getInfo(@PathVariable("newsId") Long newsId)
    {
        NewsInfo newsInfo = newsInfoService.selectNewsInfoByNewsId(newsId);

        // 判断是否为管理员
        if (!getLoginUser().getUser().isAdmin()) {
            // 验证商家权限
            Long merchantId = getMerchantIdForCurrentUser();
            if (merchantId != null && !merchantId.equals(newsInfo.getMerchantId())) {
                return AjaxResult.error("无权访问该数据");
            }
        }

        return success(newsInfo);
    }

    /**
     * 获取动态资讯详细信息（小程序端公开接口）
     */
    @GetMapping("/miniapp/{newsId}")
    public AjaxResult miniappGetInfo(@PathVariable("newsId") Long newsId)
    {
        NewsInfo newsInfo = newsInfoService.selectNewsInfoByNewsId(newsId);

        // 验证是否属于小程序绑定的商家
        Long merchantId = getMiniAppMerchantId();
        if (merchantId != null && !merchantId.equals(newsInfo.getMerchantId())) {
            return AjaxResult.error("资讯不存在");
        }

        return success(newsInfo);
    }

    /**
     * 新增动态资讯
     */
//    @PreAuthorize("@ss.hasPermi('ruoyi:newsInfo:add')")
    @Log(title = "动态资讯", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody NewsInfo newsInfo)
    {
        // 判断是否为管理员
        if (!getLoginUser().getUser().isAdmin()) {
            // 自动设置商家ID
            Long merchantId = getMerchantIdForCurrentUser();
            if (merchantId == null) {
                return AjaxResult.error("当前用户无权添加资讯信息");
            }
            newsInfo.setMerchantId(merchantId);
        }
        return toAjax(newsInfoService.insertNewsInfo(newsInfo));
    }

    /**
     * 修改动态资讯
     */
//    @PreAuthorize("@ss.hasPermi('ruoyi:newsInfo:edit')")
    @Log(title = "动态资讯", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody NewsInfo newsInfo)
    {
        // 判断是否为管理员
        if (!getLoginUser().getUser().isAdmin()) {
            // 验证商家权限
            Long merchantId = getMerchantIdForCurrentUser();
            if (merchantId != null && !merchantId.equals(newsInfo.getMerchantId())) {
                return AjaxResult.error("无权修改该数据");
            }
        }
        return toAjax(newsInfoService.updateNewsInfo(newsInfo));
    }

    /**
     * 删除动态资讯
     */
//    @PreAuthorize("@ss.hasPermi('ruoyi:newsInfo:remove')")
    @Log(title = "动态资讯", businessType = BusinessType.DELETE)
    @DeleteMapping("/{newsIds}")
    public AjaxResult remove(@PathVariable Long[] newsIds)
    {
        // 判断是否为管理员
        if (!getLoginUser().getUser().isAdmin()) {
            // 验证商家权限
            Long merchantId = getMerchantIdForCurrentUser();
            if (merchantId == null) {
                return AjaxResult.error("当前用户无权删除资讯信息");
            }

            // 检查要删除的数据是否属于当前商家
            for (Long newsId : newsIds) {
                NewsInfo newsInfo = newsInfoService.selectNewsInfoByNewsId(newsId);
                if (!merchantId.equals(newsInfo.getMerchantId())) {
                    return AjaxResult.error("无权删除不属于当前商家的数据");
                }
            }
        }

        return toAjax(newsInfoService.deleteNewsInfoByNewsIds(newsIds));
    }

    /**
     * 小程序端获取资讯列表（公开接口，不需要登录）
     * 根据资讯类型和启用状态查询资讯列表
     * @param newsType 资讯类型：1=活动 2=节日 3=公告）
     * @param status 启用状态（0=启用 1=禁用）
     * @return 资讯列表
     */
    @GetMapping("/miniapp/listByTypeAndStatus")
    public AjaxResult miniappListByTypeAndStatus(String newsType, String status) {
        // 小程序端使用固定的商家ID
        Long merchantId = getMiniAppMerchantId();

        if (merchantId == null) {
            return AjaxResult.error("未配置小程序商家ID");
        }

        // 构造查询条件
        NewsInfo newsInfo = new NewsInfo();
        newsInfo.setMerchantId(merchantId);
        newsInfo.setNewsType(newsType);
        newsInfo.setStatus(status);

        // 执行查询
        List<NewsInfo> list = newsInfoService.selectNewsInfoListByTypeAndStatus(newsInfo);
        return AjaxResult.success(list);
    }

    /**
     * 获取小程序端的商家ID
     * @return 商家ID
     */
    private Long getMiniAppMerchantId() {
        // 从配置文件中读取小程序商家ID
        return miniAppMerchantId;
    }

    /**
     * 获取当前用户所属商家ID
     * 管理端：返回当前登录管理员所属的商家ID
     * 小程序端：返回小程序绑定的商家ID
     * @return 商家ID
     */
    private Long getMerchantIdForCurrentUser() {
        // 获取当前用户ID
        Long userId = getUserId();

        // 管理员用户特殊处理
        if (SecurityUtils.isAdmin(userId)) {
            // 管理员可以看到所有数据，但在新增/修改时需要指定商家ID
            // 这里返回null，让调用方决定是否需要特殊处理
            return null;
        }

        // 普通用户：根据用户ID查询所属商家
        Merchant merchantInfo = merchantService.selectMerchantByUserId(userId);
        return merchantInfo != null ? merchantInfo.getMerchantId() : null;
    }
}
